package cn.tworice.admin.service.impl;

import cn.tworice.admin.dao.LoginDao;
import cn.tworice.admin.service.LoginService;
import cn.tworice.common.entity.Admin;
import cn.tworice.common.entity.Role;
import cn.tworice.common.entity.dto.ResourceResult;
import cn.tworice.common.entity.dto.ResourcesDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    LoginDao loginDao;

    /**
     * 判断是否登录成功
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public Admin checkLogin(String username, String password) {
        return loginDao.queryAdmin(username, password);
    }


    /**
     * 根据角色ID获取资源列表
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<ResourcesDto> getResourceByRole(String adminId) {
        List<ResourcesDto> resourcesDtos=new ArrayList<>();
        // 通过管理员ID获取角色ID
        List<Integer> roles=loginDao.queryRoleId(adminId);
        // 通过角色ID查询资源
        if(roles==null || roles.isEmpty()){
            // 判断当前用户是否没有任何权限
            return null;
        }else {
            // 根据角色ID获取拥有的资源列表(叶子节点)
            List<ResourcesDto> resourcesDtosA = loginDao.queryResourcesByRole(roles);
            // 遍历每一个叶子节点
            for(ResourcesDto resourcesDto:resourcesDtosA){
                ResourceResult result=inResources(resourcesDtos,resourcesDto,false);
                // 标志位 true表示已挂载
                if(result.getStatus()) {
                    resourcesDtos = result.getResult();
                }else {
                    // 未挂载则需要寻找该节点的根节点
                    resourcesDtos.add(getParent(resourcesDto));
                }
            }

        }

        return resourcesDtos;
    }

    /**
     * 判断resourcesA节点的父节点是否存在于resources中
     * 如存在 挂载到该节点下
     * 如不存在 查询该节点的根节点，并将该根节点存放于列表中
     * mySwitch 为标志位，true表示节点已挂载，false表示未挂载
     * @Author 二饭
     * @Email 1786705138@qq.com
     * @Date 2021/12/8 22:01
     */
    private ResourceResult inResources(List<ResourcesDto> resources, ResourcesDto resourcesA, boolean mySwitch){
        // 遍历resources 查看 resourcesA是否存在于其中
        for(ResourcesDto resourcesDto:resources){
            // 如果resourcesDto是resourcesA的父节点 并返回
            if(resourcesDto.getId()==resourcesA.getPid()){
                // 将该节点挂载到父节点上 并返回
                List<ResourcesDto> list=resourcesDto.getList();
                if(list==null){
                    list = new ArrayList<>();
                }
                list.add(resourcesA);
                resourcesDto.setList(list);

                mySwitch=true;
                ResourceResult resourceResult = new ResourceResult();
                resourceResult.setStatus(mySwitch);
                resourceResult.setResult(resources);
                return resourceResult;
            }
            // 如果该对象的子列表不为空，则继续迭代查找
            if(resourcesDto.getList()!=null && resourcesDto.getList().size()!=0){
                ResourceResult map = inResources(resourcesDto.getList(), resourcesA, false);
                if(map.getStatus()){
                    mySwitch=true;
                }
            }
        }

        // 程序走到这里说明 列表中不含有
        ResourceResult resourceResult = new ResourceResult();
        resourceResult.setStatus(mySwitch);
        resourceResult.setResult(resources);
        return resourceResult;

    }

    /**
     * 通过子节点查询根节点
     * 传入子节点，返回根节点
     * @Author 二饭
     * @Email 1786705138@qq.com
     * @Date 2021/12/8 21:32
     */
    private ResourcesDto getParent(ResourcesDto resourcesDto){
        // 判断传入对象是否为根节点
        if(resourcesDto.getPid()==0){
            return resourcesDto;
        }else {
            // 获取父节点
            ResourcesDto resourcesDtoA = loginDao.queryResourcesById(resourcesDto.getPid());
            // 将子节点挂载到父节点上
            List<ResourcesDto> list = new ArrayList<>();
            list.add(resourcesDto);
            resourcesDtoA.setList(list);
            resourcesDto=resourcesDtoA;

            return getParent(resourcesDto);
        }
    }

    /**
     * 获取所有资源
     * @author 二饭
     * @email 1786705138@qq.com
     */
    @Override
    public List<ResourcesDto> getResources() {
        List<ResourcesDto> resourcesDtos = loginDao.queryResourceAll();
        // 查找子级菜单
        for(ResourcesDto dto:resourcesDtos){
            // 查询功能列表
            List<ResourcesDto> resourcesDtos1 = getResourceByPid(dto.getId());
            for(ResourcesDto dto1:resourcesDtos1){
                dto1.setList(getResourceByPid(dto1.getId()));
            }

            // 保存页面到模块列表
            dto.setList(resourcesDtos1);
        }
        return resourcesDtos;
    }

    @Override
    public List<Role> getRolesById(String id) {
        return loginDao.queryRolesByAdminId(id);
    }

    @Override
    public Admin getAdminByLoginName(String loginName) {
        return loginDao.queryAdminByLoginName(loginName);
    }

    @Override
    public boolean setAdminAndRole(Admin admin, int roleId) {
        String id = UUID.randomUUID().toString().replaceAll("-","");
        admin.setId(id);
        admin.setDate(System.currentTimeMillis());
        int i=loginDao.insertAdmin(admin);
        if(i==1){
            int i1=loginDao.insertAdminToRole(id,roleId);
            if(i1==1){
                return true;
            }
        }
        return false;
    }

    /**
     * 通过PID获取资源列表
     * @author 二饭
     * @email 1786705138@qq.com
     */
    public List<ResourcesDto> getResourceByPid(Integer pid){
        return loginDao.queryResourceByPid(pid);
    }
}
